<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>删除操作后的最大子段和</title>
</head>
<body>
  <script>
    const find = (p, x) => {
      if (p[x] !== x) p[x] = find(p, p[x])
      return p[x]
    }
    
    function fn(nums, removeQueries) {
      // p 为父节点， s为当前连通子树的和
      let n = nums.length, p = Array.from({ length: n }, (v, i) => i), s = Array(n).fill(0), max = 0, ans = []

      for (let i = n - 1; i >= 0; i--) {
        let x = removeQueries[i]
        s[x] = nums[x]
        // 这里取当前数为x, 尝试和 x + 1，x - 1 进行连通
        for (let j = x - 1; j <= x + 1; j += 2) {
          // 如果x + 1 或者 x - 1 边界是合法的  且 已经插入过了  触发合并
          if (j >= 0 && j < n && s[j]) {
            s[x] += s[find(p, j)]
            p[find(p, j)] = x
          }
        }
        // 因为题目正序 是先删除 后算结果，那反过来 应该先算结果 后插入值
        ans.push(max)
        max = Math.max(s[x], max)
      }

      return ans.reverse()
    }
    console.log(fn([1, 2, 5, 6, 1], [0, 3, 2, 4, 1]))
  </script>
</body>

</html>